#pragma once

#include <luisa/version.h>

#include <luisa/ast/ast2json.h>
#include <luisa/ast/atomic_ref_node.h>
#include <luisa/ast/attribute.h>
#include <luisa/ast/callable_library.h>
#include <luisa/ast/constant_data.h>
#include <luisa/ast/expression.h>
#include <luisa/ast/external_function.h>
#include <luisa/ast/function.h>
#include <luisa/ast/function_builder.h>
#include <luisa/ast/interface.h>
#include <luisa/ast/op.h>
#include <luisa/ast/statement.h>
#include <luisa/ast/type.h>
#include <luisa/ast/type_registry.h>
#include <luisa/ast/usage.h>
#include <luisa/ast/variable.h>

#ifdef LUISA_ENABLE_CLANGCXX
#include <luisa/clangcxx/ast.h>
#include <luisa/clangcxx/build_arguments.h>
#include <luisa/clangcxx/compiler.h>
#endif

#include <luisa/core/basic_traits.h>
#include <luisa/core/basic_types.h>
#include <luisa/core/binary_buffer.h>
#include <luisa/core/binary_file_stream.h>
#include <luisa/core/binary_io.h>
#include <luisa/core/clock.h>
#include <luisa/core/concepts.h>
#include <luisa/core/constants.h>
#include <luisa/core/dll_export.h>
#include <luisa/core/dynamic_module.h>
#include <luisa/core/fiber.h>
#include <luisa/core/fiber_future.h>
#include <luisa/core/first_fit.h>
#include <luisa/core/intrin.h>
#include <luisa/core/logging.h>
#include <luisa/core/macro.h>
#include <luisa/core/magic_enum.h>
#include <luisa/core/managed_ilist.h>
#include <luisa/core/managed_ptr.h>
#include <luisa/core/mathematics.h>
#include <luisa/core/memory_sanitizer.hpp>
#include <luisa/core/platform.h>
#include <luisa/core/pool.h>
#include <luisa/core/shared_function.h>
#include <luisa/core/spin_mutex.h>
#include <luisa/core/stl.h>
#include <luisa/core/string_scratch.h>
#include <luisa/core/thread_safety.h>

#ifdef LUISA_ENABLE_DSL
#include <luisa/dsl/arg.h>
#include <luisa/dsl/atomic.h>
#include <luisa/dsl/binding_group.h>
#include <luisa/dsl/builtin.h>
#include <luisa/dsl/callable_library.h>
#include <luisa/dsl/constant.h>
#include <luisa/dsl/coop_vector.h>
#include <luisa/dsl/dispatch_indirect.h>
#include <luisa/dsl/expr.h>
#include <luisa/dsl/expr_traits.h>
#include <luisa/dsl/func.h>
#include <luisa/dsl/local.h>
#include <luisa/dsl/matrix.h>
#include <luisa/dsl/operators.h>
#include <luisa/dsl/polymorphic.h>
#include <luisa/dsl/raster/raster_func.h>
#include <luisa/dsl/raster/raster_kernel.h>
#include <luisa/dsl/ref.h>
#include <luisa/dsl/resource.h>
#include <luisa/dsl/rtx/aabb.h>
#include <luisa/dsl/rtx/accel.h>
#include <luisa/dsl/rtx/curve.h>
#include <luisa/dsl/rtx/hit.h>
#include <luisa/dsl/rtx/motion.h>
#include <luisa/dsl/rtx/ray.h>
#include <luisa/dsl/rtx/ray_query.h>
#include <luisa/dsl/rtx/triangle.h>
#include <luisa/dsl/shared.h>
#include <luisa/dsl/soa.h>
#include <luisa/dsl/stmt.h>
#include <luisa/dsl/struct.h>
#include <luisa/dsl/sugar.h>
#include <luisa/dsl/syntax.h>
#include <luisa/dsl/var.h>
#endif

#ifdef LUISA_ENABLE_GUI
#include <luisa/gui/framerate.h>
#include <luisa/gui/imgui_window.h>
#include <luisa/gui/input.h>
#include <luisa/gui/window.h>
#endif

#ifdef LUISA_ENABLE_IR
#include <luisa/ir/ast2ir.h>
#include <luisa/ir/fwd.h>
#include <luisa/ir/ir2ast.h>
#include <luisa/ir/transform.h>
#endif

#include <luisa/osl/hint.h>
#include <luisa/osl/instruction.h>
#include <luisa/osl/literal.h>
#include <luisa/osl/oso_parser.h>
#include <luisa/osl/shader.h>
#include <luisa/osl/symbol.h>
#include <luisa/osl/type.h>

#include <luisa/runtime/bindless_array.h>
#include <luisa/runtime/buffer.h>
#include <luisa/runtime/buffer_arena.h>
#include <luisa/runtime/byte_buffer.h>
#include <luisa/runtime/command_list.h>
#include <luisa/runtime/context.h>
#include <luisa/runtime/depth_format.h>
#include <luisa/runtime/device.h>
#include <luisa/runtime/dispatch_buffer.h>
#include <luisa/runtime/event.h>
#include <luisa/runtime/image.h>
#include <luisa/runtime/mipmap.h>
#include <luisa/runtime/raster/app_data.h>
#include <luisa/runtime/raster/depth_buffer.h>
#include <luisa/runtime/raster/raster_scene.h>
#include <luisa/runtime/raster/raster_shader.h>
#include <luisa/runtime/raster/raster_state.h>
#include <luisa/runtime/raster/vertex_attribute.h>
#include <luisa/runtime/raster/viewport.h>
#include <luisa/runtime/remote/client_interface.h>
#include <luisa/runtime/remote/server_interface.h>
#include <luisa/runtime/rhi/argument.h>
#include <luisa/runtime/rhi/command.h>
#include <luisa/runtime/rhi/command_encoder.h>
#include <luisa/runtime/rhi/curve_basis.h>
#include <luisa/runtime/rhi/device_interface.h>
#include <luisa/runtime/rhi/pixel.h>
#include <luisa/runtime/rhi/resource.h>
#include <luisa/runtime/rhi/sampler.h>
#include <luisa/runtime/rhi/stream_tag.h>
#include <luisa/runtime/rhi/tile_modification.h>
#include <luisa/runtime/rtx/aabb.h>
#include <luisa/runtime/rtx/accel.h>
#include <luisa/runtime/rtx/curve.h>
#include <luisa/runtime/rtx/hit.h>
#include <luisa/runtime/rtx/mesh.h>
#include <luisa/runtime/rtx/motion_instance.h>
#include <luisa/runtime/rtx/motion_transform.h>
#include <luisa/runtime/rtx/procedural_primitive.h>
#include <luisa/runtime/rtx/ray.h>
#include <luisa/runtime/rtx/triangle.h>
#include <luisa/runtime/shader.h>
#include <luisa/runtime/sparse_buffer.h>
#include <luisa/runtime/sparse_command_list.h>
#include <luisa/runtime/sparse_heap.h>
#include <luisa/runtime/sparse_image.h>
#include <luisa/runtime/sparse_texture.h>
#include <luisa/runtime/sparse_volume.h>
#include <luisa/runtime/stream.h>
#include <luisa/runtime/stream_event.h>
#include <luisa/runtime/swapchain.h>
#include <luisa/runtime/volume.h>

#ifdef LUISA_ENABLE_RUST
#include <luisa/rust/api_types.h>
#include <luisa/rust/api_types.hpp>
#include <luisa/rust/ir.hpp>
#include <luisa/rust/ir_common.h>
#endif

#ifdef LUISA_ENABLE_TENSOR
#include <luisa/tensor/expression.h>
#include <luisa/tensor/ext.h>
#include <luisa/tensor/fallback/i_tensor_expr_executor.h>
#include <luisa/tensor/fallback/interface.h>
#include <luisa/tensor/fallback/matmul_impl.h>
#include <luisa/tensor/fallback/set_value_impl.h>
#include <luisa/tensor/fallback/softmax_impl.h>
#include <luisa/tensor/fused_activation.h>
#include <luisa/tensor/graph.h>
#include <luisa/tensor/kernel.h>
#include <luisa/tensor/pass/expr_topo.h>
#include <luisa/tensor/pass/shader_manager.h>
#include <luisa/tensor/tensor.h>
#include <luisa/tensor/tensor_builder.h>
#include <luisa/tensor/tensor_interface.h>
#endif

#include <luisa/vstl/allocate_type.h>
#include <luisa/vstl/arena_hash_map.h>
#include <luisa/vstl/common.h>
#include <luisa/vstl/compare.h>
#include <luisa/vstl/config.h>
#include <luisa/vstl/functional.h>
#include <luisa/vstl/hash.h>
#include <luisa/vstl/hash_map.h>
#include <luisa/vstl/lmdb.hpp>
#include <luisa/vstl/lockfree_array_queue.h>
#include <luisa/vstl/log.h>
#include <luisa/vstl/md5.h>
#include <luisa/vstl/memory.h>
#include <luisa/vstl/meta_lib.h>
#include <luisa/vstl/pool.h>
#include <luisa/vstl/ranges.h>
#include <luisa/vstl/spin_mutex.h>
#include <luisa/vstl/stack_allocator.h>
#include <luisa/vstl/string_hash.h>
#include <luisa/vstl/string_utility.h>
#include <luisa/vstl/tree_map_base.h>
#include <luisa/vstl/unique_ptr.h>
#include <luisa/vstl/v_allocator.h>
#include <luisa/vstl/v_guid.h>
#include <luisa/vstl/vector.h>
#include <luisa/vstl/vstring.h>

#ifdef LUISA_ENABLE_XIR
#include <luisa/xir/argument.h>
#include <luisa/xir/basic_block.h>
#include <luisa/xir/builder.h>
#include <luisa/xir/constant.h>
#include <luisa/xir/debug_printer.h>
#include <luisa/xir/function.h>
#include <luisa/xir/instruction.h>
#include <luisa/xir/instructions/alloca.h>
#include <luisa/xir/instructions/arithmetic.h>
#include <luisa/xir/instructions/assert.h>
#include <luisa/xir/instructions/assume.h>
#include <luisa/xir/instructions/atomic.h>
#include <luisa/xir/instructions/autodiff.h>
#include <luisa/xir/instructions/branch.h>
#include <luisa/xir/instructions/break.h>
#include <luisa/xir/instructions/call.h>
#include <luisa/xir/instructions/cast.h>
#include <luisa/xir/instructions/clock.h>
#include <luisa/xir/instructions/continue.h>
#include <luisa/xir/instructions/debug_break.h>
#include <luisa/xir/instructions/gep.h>
#include <luisa/xir/instructions/if.h>
#include <luisa/xir/instructions/load.h>
#include <luisa/xir/instructions/loop.h>
#include <luisa/xir/instructions/outline.h>
#include <luisa/xir/instructions/phi.h>
#include <luisa/xir/instructions/print.h>
#include <luisa/xir/instructions/raster_discard.h>
#include <luisa/xir/instructions/ray_query.h>
#include <luisa/xir/instructions/resource.h>
#include <luisa/xir/instructions/return.h>
#include <luisa/xir/instructions/store.h>
#include <luisa/xir/instructions/switch.h>
#include <luisa/xir/instructions/thread_group.h>
#include <luisa/xir/instructions/unreachable.h>
#include <luisa/xir/metadata.h>
#include <luisa/xir/metadata/comment.h>
#include <luisa/xir/metadata/curve_basis.h>
#include <luisa/xir/metadata/location.h>
#include <luisa/xir/metadata/name.h>
#include <luisa/xir/module.h>
#include <luisa/xir/op.h>
#include <luisa/xir/passes/aggregate_field_bitmask.h>
#include <luisa/xir/passes/autodiff.h>
#include <luisa/xir/passes/call_graph.h>
#include <luisa/xir/passes/dce.h>
#include <luisa/xir/passes/dom_tree.h>
#include <luisa/xir/passes/early_return_elimination.h>
#include <luisa/xir/passes/lex_scope_analysis.h>
#include <luisa/xir/passes/local_load_elimination.h>
#include <luisa/xir/passes/local_store_forward.h>
#include <luisa/xir/passes/lower_ray_query_loop.h>
#include <luisa/xir/passes/mem2reg.h>
#include <luisa/xir/passes/outline.h>
#include <luisa/xir/passes/pointer_usage.h>
#include <luisa/xir/passes/promote_ref_arg.h>
#include <luisa/xir/passes/reg2mem.h>
#include <luisa/xir/passes/sroa.h>
#include <luisa/xir/passes/trace_gep.h>
#include <luisa/xir/passes/transpose_gep.h>
#include <luisa/xir/passes/unused_callable_removal.h>
#include <luisa/xir/special_register.h>
#include <luisa/xir/traits.h>
#include <luisa/xir/translators/ast2xir.h>
#include <luisa/xir/translators/json2xir.h>
#include <luisa/xir/translators/xir2json.h>
#include <luisa/xir/translators/xir2text.h>
#include <luisa/xir/undefined.h>
#include <luisa/xir/use.h>
#include <luisa/xir/user.h>
#include <luisa/xir/value.h>
#endif

